home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
wakka
/
source
/
screen.c
< prev
next >
Wrap
Text File
|
2000-06-25
|
6KB
|
244 lines
/*******************************
わっか
画面
*******************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys\dos.h>
#include <sys\iocs.h>
#include "wakka.h"
#include "screen.h"
#include "pad.h"
#define SPRITE_FILE "WAKKA" /* スプライトデータ */
#define BLOCK_X 16 /* ブロックの大きさ */
#define BLOCK_Y 16
#define FIELD_X (72 + 16) /* 盤の位置 */
#define FIELD_Y (72 + 16)
/*** スプライトコード *****/
#define SPR_BLOCK_S 0x010 /* ブロック側面 */
#define BG_BACK 0x100 /* 背景パターン */
#define SPRITE_REG (unsigned short*)0xeb0000 /* スプライトレジスタアドレス */
static unsigned short* sprite_reg; /* スプライト */
static unsigned short block_code[] = { /* ブロックのコード */
0x211, 0x212,
0x413, 0x414, 0x415, 0x416,
0x317, 0x318, 0x319, 0x31a,
0x41b, 0x41c,
0x213, 0x214, 0x215, 0x216,
0x31b, 0x31c
};
/**********************
垂直帰線期間待ち
**********************/
void v_synch(void)
{
pad_synch(); /* パッド同期処理 */
rand(); /* 乱数 */
while ( !(_iocs_b_bpeek((void *)0xe88001) & 0x10) ); /* 垂直帰線期間 */
while ( _iocs_b_bpeek((void *)0xe88001) & 0x10 ); /* 垂直表示期間 */
}
/***************************************
スプライト描画
引数 code = パターンコード
x, y = 表示位置
***************************************/
static
void put_sprite(unsigned short code, int x, int y)
{
*sprite_reg++ = (unsigned short)x; /* x座標 */
*sprite_reg++ = (unsigned short)y; /* y座標 */
*sprite_reg++ = code; /* パターンコード */
*sprite_reg++ = 3; /* プライオリティ */
}
/**************************************
ブロック描画
引数 block = ブロック番号
x, y = 描画座標
**************************************/
static
void draw_block(BLOCK block, int x, int y)
{
put_sprite(block_code[block], x, y); /* ブロック上部描画 */
put_sprite((block_code[block] & 0xf00) + SPR_BLOCK_S, x, y + 16);
/* ブロック側面描画 */
}
/********************
フィールド描画
********************/
static
void draw_field(void)
{
int i, j, x, y;
BLOCK b;
for (i = LEN - 1, y = FIELD_Y + BLOCK_Y*(LEN - 1); i >= 0; i--, y -= BLOCK_Y) {
for (j = 0, x = FIELD_X; j < LEN; j++, x += BLOCK_X) {
if ( (b = field[i][j]) >= 0 ) { /* ブロック描画 */
draw_block(b, x + field_dx[i][j]*BLOCK_X/0x100,
y + field_dy[i][j]*BLOCK_Y/0x100);
}
}
}
}
/**************
画面描画
**************/
void draw_screen(void)
{
int ssp;
ssp = _iocs_b_super(0); /* スーパーバイザモード */
sprite_reg = SPRITE_REG; /* スプライトレジスタ先頭 */
v_synch(); /* 垂直同期 */
draw_field(); /* フィールド描画 */
while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
sprite_reg += 3;
*sprite_reg++ = 0; /* スプライト非表示 */
}
_iocs_b_super(ssp); /* ユーザーモード */
}
/**************************************
クリア表示、入力待ち
引数 f = TRUE : クリア
FALSE : 正解表示
戻り値 TRUE : ゲーム続行
FALSE : ゲーム終了
**************************************/
Bool wait_clear(Bool f)
{
struct _symbolptr mes = {10, 80, "CLEAR", 2, 3, 0, 2, 0};
int i;
i = f ? 0 : 4;
while ( !(get_push() & (PAD_A | PAD_B)) ) {
draw_screen(); /* 画面描画 */
_iocs_bgscrlst(0, i % 64, i*2 % 64); /* 背景スクロール */
if ( i < 4 ) {
mes.color = 0x8018 + i*0x1002;
_iocs_symbol(&mes); /* "CLEAR"描画 */
mes.x1--;
}
i++;
if ( esc_key ) { /* ゲーム終了 */
return FALSE;
}
}
_iocs_wipe(); /* グラフィック消去 */
return TRUE;
}
/************************************
背景描画
引数 pat = パターン番号
************************************/
void draw_back(int pat)
{
int i, j;
_iocs_bgctrlst(0, 0, 1); /* BGページ0表示 */
_iocs_bgscrlst(0, 0, 0); /* BG表示位置 */
pat = BG_BACK + pat*16; /* 背景パターンコード */
for (i = 0; i < 64; i++) {
for (j = 0; j < 64; j++) {
_iocs_bgtextst(0, j, i, pat + (j % 4)*2 + (i % 2)
+ ((i/2 + j/4) % 2)*8);
}
}
}
/****************************************
スプライトデータ読み込み
引数 fname = ファイルネーム
戻り値 0 : 読み込み完了
1 : 読み込み失敗
****************************************/
static
int load_sprite(char* fname)
{
FILE* fp;
char *buf, *p;
unsigned short* c;
int i, j, size;
_iocs_sp_init(); /* スプライト画面初期化 */
_iocs_sp_on(); /* スプライト画面表示 */
if ( (buf = malloc(0x8000)) == NULL ) {
eprintf("メモリが足りません\n");
return 1;
}
sprintf(buf, "%s.SP", fname); /* パターンデータ */
if ( (fp = fopen(buf, "rb")) == NULL ) {
eprintf("パターンファイル \"%s\" が開けません\n", buf);
return 1;
}
size = fread(buf, 0x80, 0x100, fp);
fclose(fp);
for (i = 0, p = buf; i < size; i++, p += 0x80) {
_iocs_sp_defcg(i, 1, p); /* スプライト定義 */
}
sprintf(buf, "%s.PAL", fname); /* パレットデータ */
if ( (fp = fopen(buf, "rb")) == NULL ) {
eprintf("パレットファイル \"%s\" が開けません\n", buf);
return 1;
}
size = fread(buf, sizeof(short)*0x10, 0x0f, fp);
fclose(fp);
c = (unsigned short*)buf;
for (j = 0; j < size; j++) {
for (i = 0; i < 0x10; i++) {
_iocs_spalet(i + (1 << 0x1f), j + 1, (int)*c++);
/* パレット定義 */
}
}
free(buf);
return 0;
}
/********************************
画面初期化
戻り値 0 : 初期化完了
1 : 初期化失敗
********************************/
int init_screen(void)
{
if ( load_sprite(SPRITE_FILE) ) { /* スプライト読み込み */
return 1;
}
return 0;
}
/****************** End of File *************************************************/